// 导入 axios 
import axios from 'axios'
// 大请求携带上 token
import store from '@/store'

// 导入 element 消息提示
import {
  Message
} from 'element-ui';

// 导入 router
import router from '@/router'

// 导入登录时的时间戳
import {
  // 得到时间戳
  getTimeStamp,
} from '@/utils/auth'

// 定义一个时间戳过期时间 30分钟
const past_time = 30 * 60 * 1000
// const past_time = 5 * 1000

// 创建 axios 副本
const instance = axios.create({
  baseURL: process.env.VUE_APP_BASEURL
})

// 设置拦截器
// 请求拦截器
instance.interceptors.request.use(
  config => {
    //  得到当前时间
    const currentTime = Date.now()
    // 得到登陆时的时间戳
    const token_time = getTimeStamp()
    // 当前时间减去登录时的时间戳
    const loginTime = currentTime - token_time
    // 判断时间戳有没有过期
    if (loginTime > past_time) {
      //  清除 token 清除用户信息
      store.dispatch('user/logout')
      // 登录过期了提示一下
      // Message({
      //   error: 'info',
      //   message: '登录过期了,请重新登录'
      // })
      // 登录过期了,重新登录
      router.push(`/login?_redirect=${window.location.href.split('#') [1]}`)
      // 登录过期了中断后续操作,然后提示一下
      return Promise.reject(new Error('登录超时,请重新登录'))
    } else {
      // 登陆没过期
    }

    // 统一注入 token 将 token 添加到请求头中
    const token = store.getters.token
    // 判断是否有 token 
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    // 成功的回调
    return config
  },
  // 失败的回调
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 成功的回调
    const {
      success,
      message
    } = response.data
    if (success) {
      return response.data
    } else {
      // 提示错误
      Message({
        type: 'error',
        message: message
      })
      return Promise.reject(new Error(message))
    }
  },
  // 失败的回调
  error => {
    const bool = error.response &&
      error.response.data &&
      error.response.data.code === 10002
    if (bool) {
      Message({
          type: 'info',
          message: '登录过期,请重新登录'
        }),
        // token 不存在,就清除信息 重新登录
        store.dispatch('user/logout'),
        // 跳转到登录页
        router.push('/login')
    }
    return Promise.reject(error)
  }
)
// 响应拦截器

// 暴露 instanct 出去
export default instance
